import pygame
import random
from sys import exit #向sys模块借用个exit函数来退出程序
#定义一个敌机类
class Enemy:
    def restar(self):
        #重置敌机位置与速度
        self.x=random.randint(100,600)
        self.y=random.randint(-200,-80)
        self.speed=random.random()+0.4
    def __init__(self):
        self.restar()
        self.image=pygame.image.load('enermy.jpg')
    def move(self):
        if self.y < 800:
            self.y+=self.speed  #向下移动
        else:
            self.restar()
 
#定义一个bullet类，封装子弹相关的数据和方法
class Bullet:
    def __init__(self):
        self.x=0;
        self.y=-1;
        self.image=pygame.image.load('bulet.jpg')
        self.active=False  #默认不激活子弹
 
    def move(self):
        #激活状态下，向上移动
        if self.active:
            self.y-=0.8
        #挡飞出屏幕，设为不激活
        if self.y<0:
            self.active=False
    def restar(self):
        #重置子弹位置子弹
        mouseX,mouseY=pygame.mouse.get_pos()
        self.x=mouseX-self.image.get_width()/2;
        self.y=mouseY-self.image.get_height()/2;
        self.active=True;
def checkhit(enemy,bullet):
    #如果子弹在敌机的图片范围之内
    if (bullet.x > enemy.x and bullet.x < enemy.x + enemy.image.get_width()) and (
                    bullet.y > enemy.y and bullet.y < enemy.y + enemy.image.get_height()
        ):
        enemy.restar();
        bullet.active=False
        return True
    return False
class Plane:
    def restar(self):
        self.x=200
        self.y=600
    def __init__(self):
        self.restar()
        self.image=pygame.image.load('plane.jpg')
    def move(self):
        x, y = pygame.mouse.get_pos();  # 跟随鼠标移动
        x -= self.image.get_width() / 2;
        y -= self.image.get_height() / 2;
        self.x=x;
        self.y=y
def checkcrash(enemy, plane):
    if (plane.x + 0.7*plane.image.get_width() > enemy.x) and (
        plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and (
        plane.y + 0.7*plane.image.get_height() > enemy.y) and (
        plane.y + 0.3*plane.image.get_width() < enemy.y + enemy.image.get_height()
    ):
        return True
    return False
pygame.init()
screen=pygame.display.set_mode((1000,700),0,32)  #创建一个窗口
pygame.display.set_caption('xwr!')#设置窗口标题
background=pygame.image.load('pygame.jpg')  #加载并转换图像
plane=Plane()#加载飞机图像
bullets=[]#创建子弹的list
for i in range(5):
    bullets.append(Bullet())  #向list添加5发子弹
count_b=len(bullets)#子弹总数
index_b=0  #即将激活的子弹序号
interval_b=0#发射子弹的间隔
enemies=[]
for e in range(5):
    enemies.append(Enemy())
gameover = False
#分数
score = 0
#用以显示文字的font变量
font = pygame.font.Font(None, 32)
while True:  #游戏主循环函数
    for event in pygame.event.get():
        if event.type==pygame.QUIT:  #接收到退出事件后退出程序
            pygame.quit()
            exit()
        if gameover and event.type==pygame.MOUSEBUTTONUP:
            plane.restar()
            for e in enemies:
                e.restar()
            for b in bullets:
                b.restar()
            score=0;
            gameover=False
    screen.blit(background, (0, 0))  # 将背景图画上去
    if not gameover:
        interval_b-=1  #发射间隔递减
        if interval_b<0:   #激活一发子弹
 
            bullets[index_b].restar()
            interval_b=80  #重置间隔时间
            index_b=(index_b+1)%count_b#子弹序号周期性递增
        for b in bullets:  #处于激活状态的子弹，移动位置并绘制
            if b.active:
 
                for e in enemies:
                    if checkhit(e,b):
                        score+=100
                b.move()
                screen.blit(b.image,(b.x,b.y))
        for e in enemies:
            if checkcrash(e, plane):
                gameover = True
            e.move()
            screen.blit(e.image,(e.x,e.y))
        plane.move()
        screen.blit(plane.image, (plane.x, plane.y))
        # 在屏幕左上角显示分数
        text = font.render("Socre: %d" % score, 1, (0, 0, 0))
        screen.blit(text, (0, 0))
    else:
        # 在屏幕中央显示分数
        text = font.render("Socre: %d" % score, 1, (0, 0, 0))
        screen.blit(text, (190, 400))
        pass
    pygame.display.update()  #刷新一下界面